package top.hkyzf;

import com.mojang.logging.LogUtils;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.client.ClientRegistry;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.slf4j.Logger;
import top.hkyzf.event.KeyBoardEvents;
import top.hkyzf.util.ClientConfig;
import top.hkyzf.util.Utils;

import java.util.stream.Collectors;

/**
 * description: 一键执行命令，比如一键回城，血量保护
 * Mod注解处的值应与 META-INF/mods.toml 文件中的配置一致
 * @author zhufeng
 * @date 2022/8/4 12:54
 * @version V1.0
 */
@Mod(Utils.MOD_ID)
public class OneKeyCommandMod {
    /**
     * 获取一个 slf4j 日志记录器
     */
    private static final Logger LOGGER = LogUtils.getLogger();

    /**
     * 空参的构造方法
     */
    public OneKeyCommandMod() {
        // 在 Mod 初始化过程中注册初始化方法
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        // 在 Mod 初始化过程中注册 IMC 入队事件
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
        // 在 Mod 初始化过程中注册 IMC 处理事件
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);

        // 注册我们自己感兴趣的服务器和其他游戏活动
        // 注册配置类
        ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ClientConfig.CONFIG_SPEC);
        // 实例方式注册的事件需要手动注册
        MinecraftForge.EVENT_BUS.register(this);

        // 注册按键
        ClientRegistry.registerKeyBinding(KeyBoardEvents.TRANSPORT_KEY);
        ClientRegistry.registerKeyBinding(KeyBoardEvents.ON_HOOK_KEY);
    }

    /**
     * 一些预初始化代码
     * @param event 初始化事件
     */
    private void setup(final FMLCommonSetupEvent event) {
        LOGGER.info("预初始化");
        LOGGER.info("土方块 >> {}", Blocks.DIRT.getRegistryName());
    }

    /**
     * 用来发送 IMC 事件到另一个 mod 的方法
     * @param event IMC 入队事件
     */
    private void enqueueIMC(final InterModEnqueueEvent event) {
        // 将 IMC 事件发送到另一个 mod 的示例代码
        InterModComms.sendTo(Utils.MOD_ID, "helloworld", () -> {
            LOGGER.info("首次使用 IMC 发送事件消息！");
            return "Hello World";
        });
    }

    /**
     * 接收和处理另一个 mod 发送过来的 IMC 事件
     * @param event IMC 处理事件
     */
    private void processIMC(final InterModProcessEvent event) {
        // 接收和处理另一个 mod 的 IMC 事件的示例代码
        LOGGER.info("接收到 IMC 事件消息为：{}", event.getIMCStream()
                .map(m->m.messageSupplier().get())
                .collect(Collectors.toList()));
    }

    /**
     * 实例注册方式
     * 通过 MinecraftForge.EVENT_BUS.register(this) 手动注册
     * 您可以使用 SubscribeEvent 并让事件总线发现方法来调用
     * @param event 服务器启动事件
     * @see top.hkyzf.event.RegistryEvents 静态注册方式
     */
    @SubscribeEvent
    public void onServerStarting(ServerStartingEvent event) {
        // 在服务器启动时做一些事情
        LOGGER.info("服务器启动中...");
    }

}
